home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ For TASM / THUNK95.PAK / APP32.CPP next >
C/C++ Source or Header  |  1996-02-21  |  6KB  |  209 lines

  1. //----------------------------------------------------------------------------
  2. // Thunk95 example program
  3. // Copyright (c) 1996 by Borland International, All Rights Reserved
  4. //----------------------------------------------------------------------------
  5. // App32 - Demonstrates an application which calls into a 16-bit DLL
  6. // using Windows '95 Flat Thunking. Note that the code makes no
  7. // special allowances for the thunk calls - instead, this application
  8. // actually calls into a 32-bit DLL which, in turn, calls into the
  9. // 16-bit DLL. Later, if the tools.dll gets ported to 32-bit, then the
  10. // 32-bit intermediate DLL is replaced with a true 32-bit version of
  11. // the tool library and the application merely needs to be re-linked.
  12. //=====================================================================
  13. #define STRICT
  14. #include <windows.h>
  15. #include <stdio.h>
  16. #pragma hdrstop
  17. #include <windowsx.h>
  18. #include "app32.rh"
  19. #include "tools.h"
  20.  
  21. LRESULT FAR PASCAL _export WndProc(HWND, UINT , WPARAM, LPARAM);
  22. BOOL FAR PASCAL __export DlgProc(HWND, UINT, UINT, LONG);
  23.  
  24. //
  25. // Keep in synch with enum
  26. //
  27. static char * empStatus[] =
  28.    {
  29.    {"Undefined"}, {"Newly hired"}, {"Wage"},
  30.    {"Salaried"}, {"Departed"}, {"Terminated"}
  31.    };
  32.  
  33. static char dispData [1024];
  34.  
  35. //
  36. // WinMain - application entry point creates main program window and
  37. //    spins message loop.
  38. //
  39. #pragma argsused
  40. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  41.                      LPSTR lpszCmd, int nCmdShow)
  42.    {
  43.    static char szAppName[] = "Thunk95";
  44.    HWND     hWnd;
  45.    MSG      msg;
  46.    WNDCLASS wndclass;
  47.    HACCEL   hAccel;
  48.  
  49.    if (!hPrevInstance)
  50.       {
  51.       wndclass.style         = CS_HREDRAW | CS_VREDRAW;
  52.       wndclass.lpfnWndProc   = (WNDPROC)WndProc;
  53.       wndclass.cbClsExtra    = 0;
  54.       wndclass.cbWndExtra    = 0;
  55.       wndclass.hInstance     = hInstance;
  56.       wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  57.       wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  58.       wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  59.       wndclass.lpszMenuName  = MAKEINTRESOURCE(ID_MAINMENU);
  60.       wndclass.lpszClassName = szAppName;
  61.  
  62.       RegisterClass (&wndclass);
  63.       }
  64.  
  65.    hWnd = CreateWindow(szAppName, "Windows '95 Flat Thunking Example",
  66.                         WS_OVERLAPPEDWINDOW,
  67.                         CW_USEDEFAULT, CW_USEDEFAULT,
  68.                         CW_USEDEFAULT, CW_USEDEFAULT,
  69.                         NULL, NULL, hInstance, NULL);
  70.  
  71.    ShowWindow(hWnd, nCmdShow);
  72.    UpdateWindow(hWnd);
  73.  
  74.    hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(ID_MAINMENU));
  75.  
  76.    while(GetMessage(&msg, NULL, 0, 0))
  77.       {
  78.       if(!TranslateAccelerator(hWnd, hAccel, &msg))
  79.          {
  80.          TranslateMessage(&msg);
  81.          DispatchMessage(&msg);
  82.          }
  83.       }
  84.    return msg.wParam;
  85.    }
  86.  
  87.  
  88. //
  89. // WndProc - Callback for the main application window. Processes menu
  90. //    selections and handles updating data display.
  91. //
  92. LRESULT FAR PASCAL _export WndProc(HWND hWnd, UINT message, WPARAM wParam,
  93.                                     LPARAM lParam)
  94.    {
  95.    static int strTableSize;
  96.    static int empCount;
  97.  
  98.    switch(message)
  99.       {
  100.       // Since we are simulating the database...
  101.       case WM_CREATE:
  102.          strTableSize = StrTableSize();
  103.          empCount = EmpCount();
  104.          break;
  105.  
  106.       case WM_COMMAND:
  107.          switch(GET_WM_COMMAND_ID(wParam, lParam))
  108.             {
  109.             case CM_ABOUT:
  110.                DialogBox((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
  111.                         MAKEINTRESOURCE(ID_ABOUTDLG), hWnd, DlgProc);
  112.                return 0;
  113.  
  114.             case CM_EXIT:
  115.                DestroyWindow(hWnd);
  116.                return 0;
  117.  
  118.             case CM_MULTIPLY:
  119.                {
  120.                int v1 = 5;
  121.                long v2 = 2;
  122.                long result = Multiply(v1, v2);
  123.                wsprintf(dispData, "%d * %ld = %ld", v1, v2, result);
  124.                InvalidateRect(hWnd, NULL, true);
  125.                return 0;
  126.                }
  127.  
  128.             case CM_MULTIPLYREAL:
  129.                {
  130.                double v1 = 3.141592654;
  131.                double v2 = 7.608;
  132.                long double result = MultiplyReal(v1, v2);
  133.                sprintf(dispData, "%f * %f = %Lf", v1, v2, result);
  134.                InvalidateRect(hWnd, NULL, true);
  135.                return 0;
  136.                }
  137.  
  138.             case CM_GETSTRING:
  139.                {
  140.                static int index = -1;
  141.                ++index %= strTableSize;   // Loopt thru table
  142.                char tempBuf [40];
  143.                wsprintf(dispData, "Sting ID %d = %s", index,
  144.                         (StringLookup(index, tempBuf) ? tempBuf :
  145.                         "Lookup failure"));
  146.  
  147.                InvalidateRect(hWnd, NULL, true);
  148.                return 0;
  149.                }
  150.  
  151.             case CM_GETEMPLOYEE:
  152.                {
  153.                static int index = -1;
  154.                EmpRecord empRec;
  155.                memset(&empRec, 0, sizeof(empRec));
  156.                ++index %= empCount;    // Loop thru table
  157.                GetRecord(index, &empRec);
  158.                sprintf(dispData, "%s %s\nID: %d\nDept: %d\nStatus: %s",
  159.                            empRec.name, empRec.family, empRec.empNum,
  160.                            empRec.dept, empStatus[empRec.status]);
  161.                InvalidateRect(hWnd, NULL, true);
  162.                return 0;
  163.                }
  164.             }
  165.          break;
  166.  
  167.       case WM_PAINT:
  168.          HDC hdc;
  169.          PAINTSTRUCT ps;
  170.          RECT rectClient;
  171.  
  172.          hdc = BeginPaint(hWnd, &ps);
  173.          GetClientRect(hWnd , &rectClient);
  174.  
  175.          SetBkMode(hdc, TRANSPARENT);
  176.          DrawText(hdc, dispData, strlen(dispData), &rectClient,
  177.                   DT_CENTER|DT_VCENTER|DT_WORDBREAK);
  178.  
  179.          EndPaint(hWnd, &ps);
  180.          break;
  181.  
  182.       case WM_DESTROY:
  183.          PostQuitMessage (0);
  184.          return 0;
  185.       }
  186.  
  187.    return DefWindowProc(hWnd, message, wParam, lParam);
  188.    }
  189.  
  190.  
  191. #pragma argsused
  192. BOOL FAR PASCAL __export DlgProc(HWND hDlg, UINT msg, UINT wParam, LONG lParam)
  193.    {
  194.    switch(msg)
  195.       {
  196.       case WM_INITDIALOG:
  197.          return true;
  198.       case WM_COMMAND:
  199.          if(wParam==IDOK || wParam==IDCANCEL)
  200.             {
  201.             EndDialog(hDlg, 0);
  202.             return true;
  203.             }
  204.          break;
  205.       }
  206.    return false;
  207.    }
  208.  
  209.